#include "../include/Monde.h"
#include "../include/defines.h"

// Tous les includes pour les elements *********
// nb : pourrait etre remplacé par un #include "../include/includeElements.h
#include "../include/Villageois.h"
#include "../include/Entite.h"
#include "../include/Forum.h"


Monde::Monde( Taille t) : carte(&batiments,&entites,t)
{

}
int Monde::ajouterBatiment(Batiment* b)
{
	bool valide = true;
	for( unsigned int i=0; i< batiments.size(); i++)
	{
		if( b == batiments[i])
		{
			#if VERBOSE
				std::cout<<"WARNING ajout batiment - deja existant"<<std::endl;
			#endif
			valide = false;		
		}	
	}
	if( valide )
	{
		#if VERBOSE
				std::cout<<"BATIMENT AJOUTE"<<std::endl;
		#endif
		batiments.push_back(b);
		return 0;
	}
	else
		return -1;
}
int Monde::ajouterEntite(Entite* e)
{
	bool valide = true;
	for( unsigned int i=0; i< entites.size(); i++)
	{
		if( e == entites[i])
		{
			#if VERBOSE
				std::cout<<"erreur ajout entite - deja existante"<<std::endl;
			#endif
			valide = false;		
		}	
	}
	if( valide )
	{
		#if VERBOSE
			std::cout<<"ENTITE AJOUTE"<<std::endl;
		#endif
		entites.push_back(e);
		return 0;
	}
	else
		return -1;
}

int Monde::executerUnTour()
{

	// etape 1 : recuperation des unités dont la construction  est finie
	int i;
	for( i=0; i< joueurs.size(); i++)
	{
		joueurs[i].getUniteConstructionFinie();
	} 

	// etape 2 : execution des occupations des unités
	for( i=0; i< entites.size(); i++)
	{
		// une occupation terminée est détruite dans l'entite, du coup monde ne gere rien
		entites[i]->lancerOccupation();
	} 
}

void Monde::initialiser(initPartie init)
{
#if VERBOSE
	std::cout<<"configuration des entites du jeu..."<<std::endl;
#endif
/**
*	CONFIGURATION DES ELEMENTS
*
*	   /!\ !!! ATTENTION !!! /!\
*	   
*	Suivre l'ordre des énumérations	
*
*/

///*********** ENTITES ***********************
/*
enum Entites{
	VILLAGEOIS=0,GUERRIER=1
};
*/
#if VERBOSE
std::cout<<" Chargement des entites (2)"<<std::endl;
#endif
	// VILLAGEOIS

	Ressource cout(0,50,0);
	entites_config.push_back(CarracteristiquesEntite( 10, 40, 20, 10.0f,
			cout));

	// GUERRIER

	cout = Ressource(0,80,0);
	entites_config.push_back(CarracteristiquesEntite( 10, 45, 28, 12.0f,
			cout));

///*********** BATIMENTS ***********************
/*
enum Batiments{
	CASERNE=1,FORUM=0
};
*/
#if VERBOSE
std::cout<<" Chargement des batiments (2)"<<std::endl;
#endif
	// FORUM
	cout = Ressource(250,0,0);
	batiments_config.push_back(CarracteristiquesElement( 250, cout));

	// CASERNE
	cout = Ressource(100,0,0);
	batiments_config.push_back(CarracteristiquesElement( 400, cout));


/**
*
* *********************** CONFIGURATION DES JOUEURS ***********************
*
*/
#if VERBOSE
std::cout<<"configuration des "<<init.nbJoueurs<<" joueurs... "<<std::endl;
#endif

// depend du nombre de joueurs
for( int i=0; i< init.nbJoueurs; i++)
{
	Joueur j(this, i);
	j.init( entites_config,batiments_config);
	j.setConditionsDepart( Ressource(*init.ressources));
	joueurs.push_back( j);
}
#if VERBOSE
std::cout<<"	joueurs créés "<<std::endl;
#endif
if( init.type_config == 0 ) // choix par defaut
{
	// ajout des elements
	for( unsigned int i=0; i< joueurs.size(); i++)
	{
		for(unsigned int j=0; j<5; j++){	
		// on donne au villageois l'adresse de la carracteristique qui lui correspond chez le joueur
		Villageois* v = new Villageois( i, joueurs[i].getEntite_config(VILLAGEOIS) );
		Position p;
		   p.x = 100*i+10*j;
	 	   p.y = 100*i+15*j;
		v->setPosition(p);
		joueurs[i].ajouterEntite( v);
		}
		// batiments
		Forum *f = new Forum( i, joueurs[i].getBatiment_config(FORUM) );
		Position p;
		   p.x = 80*i;
	 	   p.y = 300+9*i;
		f->setPosition(p);
		joueurs[i].ajouterBatiment( f);
	}
	
}
#if VERBOSE
std::cout<<"	joueurs initialisés"<<std::endl;
#endif
#if VERBOSE
std::cout<<"configuration des "<<init.nbJoueurs<<" joueurs... done"<<std::endl;
#endif
/// end

	/**std::ifstream fichier( _fichier.c_str(), std::ios::in);
	if( !fichier)
	{
		std::cout<<"Erreur fichier :"<<_fichier<<std::endl;
		return;
	}	
	char c;
	std::string tmp;

	std::cout<<"Fichier ok :"<<_fichier<<std::endl;
	std::cout<<"bit eof :"<<fichier.eof()<<std::endl;	

	while( !fichier.eof())
	{
		fichier.get(c);
		std::cout<<"1er char :"<<c<<std::endl;
		if( c == '<' )
		{	
			fichier >> tmp;
			std::cout<<"chaine :"<<tmp<<std::endl;
			if( tmp.compare(std::string("Batiment")==0)
			{
				fichier >> tmp;
				
		}
		 fichier.get(c);
		std::cout<<"2er char :"<<c<<std::endl;
		if( c == '>' )
		{
			std::cout<<" fin fichier";
		}
	} */
	
}

std::vector<Entite*> Monde::getEntites()
{
	return entites;
}

std::vector<Batiment*> Monde::getBatiments(){
	return batiments;
}

Carte Monde::getCarte()
{
	return carte;
}

Joueur Monde::getJoueur(int i)
{
	return joueurs[i];
}

bool Monde::enCours()
{
	return true;
}
		
/*void Monde::creerOccupation( Entite *e1, Entite *e2)
{
	if( e1->getID_Owner() != e2->getID_Owner() )
	{
		// taper
	}

	Entite* esrc = dynamic_cast<Entite*> (e1);

	if( esrc != NULL )
	{
		// si notre source est une entite
		std::cout<<" Vous avez selectionne : entite"<<std::endl;

		return;
	}

	Batiment* bsrc = dynamic_cast<Batiment*> (e1);
	if( bsrc != NULL )
	{
		// si notre source est une batiment
		std::cout<<" Vous avez selectionne : batiment"<<std::endl;

		return;
	}
}*/

void Monde::creerOccupation( Entite *e1, Element *e2)
{
	if( e1->getID_Owner() != e2->getID_Owner() )
	{
		// taper
		std::cout<<"[MONDE] Taper"<<std::endl;
	}
	else
		std::cout<<"[MONDE] Copain"<<std::endl;
}

void Monde::creerOccupation( Entite *e1, Position p2)
{
	// Deplacement
	
	Occupation *occ = new Deplacement( e1, p2, &carte);
	e1->definirOccupation( occ);
}

